1. Description of Data (Published Map)

Fishman et al. (2001) constructed and analyzed a linkage map based on an F2 hybrid population composed of 526 individuals (N = 526). First, the F2 hybrid population was generated by crossing Mimulus guttatus and Mimulus nasutus inbred lines. The M. guttatus parental line was derived from an annual highly outcrossing population and was formed by more than five generations of selfing with single seed descent) (IM62). The M. nasutus parental line was derived from a wild population and maintained for several generations in the greenhouse through autonomous self-fertilization (SF5.4). Later, this F2 population was genotyped for 255 molecular markers (27 microsatellites; 4 gene-based markers; and 224 AFLPs).

The genetic linkage map was constructed using the software MAPMAKER 3.0 (Lander et al., 1987). They used the GROUP command with the Kosambi mapping to organize markers into linkage groups (two-point linkage criteria: minimum LOD 6.0 and maximum distance between markers of 37 cM) and the ORDER command to map the most likely order for each group. The multipoint ordering used a threshold of LOD 3.0 to find a starting subset of five markers and to place markers in a first-round and then tried to place the remaining markers with a LOD threshold of 2.0. The unreliable markers, along with any linked but unplaced markers, were then individually evaluated using the TRY, COMPARE, MAP, and RIPPLE commands to generate and compare alternative orders. The final map consists of 174 markers distributed on 14 linkage groups with a total length of 1780 cM (Kosambi). The 14 framework linkage groups correspond to the haploid chromosome number of these Mimulus species.

The linkage map presented by them provides a framework for studying the genetic architecture of an evolutionarily important adaptation and also allows the direct examination of interactions between genomes in the early stages of speciation. In addition, the map reveals localized and directional segregation distortion, which has important implications for speciation and hybridization.

2. Description of Data (Map Update)

After the publication of Fishman et al. (2001), more loci were genotyped. Now, we will build a new map using the entire dataset using the software OneMap (Margarido et al., 2007). OneMap was the first software developed to simultaneously estimate the linkage and linkage phases (integrated genetic map) between markers in outcrossing species (F1). It has two tutorials that teach step by step how to construct a genetic linkage map in inbreeding and outcrossing populations. You can consult the tutorials here (https://github.com/augusto-garcia/onemap).

2.1 Importing Data

For F2s, two input formats are accepted: OneMap file format or MAPMAKER file format. Both types of raw file can contain phenotypic information, but this will not be used during map construction, that requires only genotypic information (made available by molecular markers). As the dataset file is in MAPMAKER format, we used the read_mapmaker function to import it to OneMap.

library("onemap")
library("gridExtra")
data_map = read_mapmaker(file="m_feb06.raw")
##  --Read the following data:
##  Type of cross:          f2 
##  Number of individuals:  287 
##  Number of markers:      418 
##  Missing trait values:       
##    fl: 11 
##    fs: 19 
##    ft: 11 
##    ll: 20 
##    nv: 12 
##    pa: 35 
##   pal: 11 
##    pv: 12 
##    sa: 11 
##    sl: 11 
##    ss: 28 
##    tl: 11 
##    tp: 12 
##    tw: 11 
##    vi: 12 
##    ww: 11
data_map
##   This is an object of class 'onemap'
##     Type of cross:      f2 
##     No. individuals:    287 
##     No. markers:        418 
##     CHROM information:  no 
##     POS information:    no 
##     Percent genotyped:  89 
## 
##     Segregation types:
##        AA : AB : BB -->  213
##         Not AA : AA -->  92
##         Not BB : BB -->  113
## 
##     No. traits:         16 
##     Missing trait values: 
##    fl: 11 
##    fs: 19 
##    ft: 11 
##    ll: 20 
##    nv: 12 
##    pa: 35 
##   pal: 11 
##    pv: 12 
##    sa: 11 
##    sl: 11 
##    ss: 28 
##    tl: 11 
##    tp: 12 
##    tw: 11 
##    vi: 12 
##    ww: 11
Note that the data consists of a sample of 287 individuals genotyped for 418 markers with 11% of missing data. In relation to the total number of marks, 213 markers are codominant (AA, AB, or AB), 92 markers are dominant in one parent (not AA or AA), and 113 markers are dominant in the other parent (not BB or BB). In addition, there is no chromosome and physical position information and there is phenotypic information for 16 traits in the data set, that can be used for QTL mapping.

2.2 Visualization of Raw Data

Using the OneMap it is possible to see the graphic of raw data and the number of loci within each type of marker. These graphics show that the proportion of codominant and dominant markers is similar.

plot(data_map)

plot_by_segreg_type(data_map)

2.3 Filtering of Markers

2.3.1 Redundant Markers:

Before the map construction, two steps of filtration were performed. In the first filtering, the markers with redundant information were removed using the find_bins and create_data_bins functions. Redundant markers are markers that have the same genotypic information, usually because recombination events did not happen between them. In this case, these markers are not informative and increase the computational effort during the map building. Therefore, they can be removed for map building. Once the maps are finished, they can be added again.

bins = find_bins(data_map, exact = FALSE)
bins
## This is an object of class 'onemap_bin'
##     No. individuals:                         287 
##     No. markers in original dataset:         418 
##     No. of bins found:                       416 
##     Average of markers per bin:              1.004808 
##     Type of search performed:                non exact
data_bins = create_data_bins(data_map, bins)
data_bins
##   This is an object of class 'onemap'
##     Type of cross:      f2 
##     No. individuals:    287 
##     No. markers:        416 
##     CHROM information:  no 
##     POS information:    no 
##     Percent genotyped:  89 
## 
##     Segregation types:
##        AA : AB : BB -->  212
##         Not AA : AA -->  92
##         Not BB : BB -->  112
## 
##     No. traits:         16 
##     Missing trait values: 
##    fl: 11 
##    fs: 19 
##    ft: 11 
##    ll: 20 
##    nv: 12 
##    pa: 35 
##   pal: 11 
##    pv: 12 
##    sa: 11 
##    sl: 11 
##    ss: 28 
##    tl: 11 
##    tp: 12 
##    tw: 11 
##    vi: 12 
##    ww: 11
In this step, two redundant markers were removed and now the dataset has 416 markers.

2.3.2 Segregation Test:

In the second filtering, the markers with Mendelian segregation deviations were identified using the test_segregation function. This function performs the chi-square test using global alpha (\(\alpha\)) of Bonferroni correction for multiple tests. With the select_segreg function, markers without segregation deviations were selected. Using the plot function from the OneMap package, it is possible to see how many markers are distorted under Bonferroni’s criterion. In this case, 14% of markers have segregation deviation.

It is not recommended to use these markers to build the genetic linkage maps, because generally the statistical models for the map building process follow Mendel’s law as an assumption. However, they can be used to saturate the map.

data_seg = test_segregation(data_bins)
a = print(data_seg) 
head(a, 10)
##    Marker    H0 Chi-square      p-value % genot.
## 1   AA461   3:1  9.6012121 0.0019444897    95.82
## 2   AA420   3:1  0.8836364 0.3472076393    95.82
## 3   AA404   3:1  1.8436364 0.1745253406    95.82
## 4   AA384   3:1  3.9381818 0.0472017677    95.82
## 5   AA378   3:1 12.3648485 0.0004374931    95.82
## 6  AA371C 1:2:1  5.3927273 0.0674503413    95.82
## 7   AA361   3:1  4.8109091 0.0282801226    95.82
## 8   AA341   3:1  2.2412121 0.1343756065    95.82
## 9   AA311   3:1  5.4412121 0.0196670167    95.82
## 10  AA280   3:1  3.4048485 0.0650050838    95.82
Bonferroni_alpha(data_seg)
## [1] 0.0001201923
select_segreg(data_seg, distorted = FALSE)
##   [1] "AA461"     "AA420"     "AA404"     "AA384"     "AA378"     "AA371C"   
##   [7] "AA361"     "AA341"     "AA311"     "AA280"     "AA277"     "AA270"    
##  [13] "AA268"     "AA246"     "AA208"     "AA167"     "AA166C"    "AA163"    
##  [19] "AA158"     "AA137"     "AA100"     "AA95"      "AA66"      "BA497"    
##  [25] "BA449"     "BA445"     "BA416"     "BA400"     "BA394"     "BA384"    
##  [31] "BA374"     "BA372"     "BA334"     "BA314"     "BA311"     "BA301"    
##  [37] "BA222"     "BA220"     "BA210"     "BA175"     "BA172"     "BA158"    
##  [43] "BA153"     "BA145"     "BA125"     "BA117"     "BA113"     "BA75"     
##  [49] "BA69"      "BB281"     "BB279"     "BB259"     "BB218"     "BB216"    
##  [55] "BB210"     "BB208"     "BB198"     "BB190"     "BB186"     "BB182"    
##  [61] "BB176"     "BB167"     "BB122"     "BB119"     "BB102"     "CA497"    
##  [67] "CA415"     "CA399"     "CA392"     "CA384"     "CA378"     "CA315"    
##  [73] "CA305"     "CA297"     "CA289"     "CA283"     "CA279"     "CA261"    
##  [79] "CA238"     "CA233"     "CA228"     "CA220"     "CA217"     "CA210"    
##  [85] "CA198"     "CA196"     "CA174"     "CA167"     "CA152C"    "CA150"    
##  [91] "CA140"     "CA131"     "CA122"     "CA96"      "CA75"      "CB333"    
##  [97] "CB329"     "CB309"     "CB280"     "CB272"     "CB257"     "CB246"    
## [103] "CB230"     "CB216"     "CB187"     "CB173"     "CB172"     "CB166"    
## [109] "CB162"     "CB156"     "CB126"     "CB115"     "CB55"      "BD433"    
## [115] "BD429"     "BD411"     "BD371"     "BD316C"    "BD292"     "BD286"    
## [121] "BD270"     "BD263"     "BD251"     "BD243"     "BD239"     "BD209"    
## [127] "BD179"     "BD175"     "BD170"     "BD169"     "BD143"     "BD130"    
## [133] "BD115"     "BD99"      "BD68"      "BD55"      "BD189C"    "AA153C"   
## [139] "AA296C"    "AA346C"    "AA374C"    "AA454C"    "BA245C"    "BA279C"   
## [145] "BA396C"    "CA183C"    "CA258C"    "CB263C"    "BB103C"    "AAT217"   
## [151] "AAT261"    "AAT240"    "AAT278"    "AAT39"     "AAT211"    "AAT222"   
## [157] "AAT374"    "AAT372"    "AAT296"    "AAT230"    "AAT308"    "AG19"     
## [163] "AAT364"    "AAT300"    "CYCB"      "AAT242"    "BC546"     "BC542"    
## [169] "BC512"     "BC506"     "BC498"     "BC478"     "BC392"     "BC379"    
## [175] "BC376"     "BC374"     "BC334"     "BC330"     "BC321"     "BC266"    
## [181] "BC243"     "BC219"     "BC216"     "BC199"     "BC192"     "BC167"    
## [187] "BC135"     "BC131"     "BC126"     "BC125"     "BC108"     "BC83"     
## [193] "BC80"      "BC70"      "BC586C"    "BC194C"    "BC128C"    "CC540"    
## [199] "CC531"     "CC457"     "CC450"     "CC447"     "CC402"     "CC392"    
## [205] "CC387"     "CC381"     "CC378"     "CC371"     "CC359"     "CC330"    
## [211] "CC286"     "CC283"     "CC270"     "CC262"     "CC150"     "CC149"    
## [217] "CC138"     "CC132"     "CC130"     "CC126"     "CC124"     "CC114"    
## [223] "CC93"      "CC61"      "CC385C"    "CC338C"    "CC171C"    "AAT312"   
## [229] "AAT283"    "LFY"       "AAT333"    "AP3"       "MgSTS17"   "MgSTS18"  
## [235] "MgSTS21"   "MgSTS25"   "MgSTS22"   "MgSTS27"   "MgSTS26"   "MgSTS23"  
## [241] "MgSTS28"   "MgSTS105"  "MgSTS120"  "MgSTS93"   "MgSTS133"  "MgSTS58"  
## [247] "MgSTS55"   "MgSTS40"   "MgSTS98"   "MgSTS45"   "MgSTS11"   "MgSTS132" 
## [253] "MgSTS212"  "MgSTS228"  "MgSTS229"  "MgSTS234"  "MgSTS308"  "MgSTS316" 
## [259] "MgSTS323"  "MgSTS36"   "MgSTS43"   "MgSTS437"  "MgSTS48"   "MgSTS49"  
## [265] "MgSTS59"   "MgSTS68"   "MgSTS508"  "MgSTS529"  "MgSTS455"  "MgSTS468" 
## [271] "MgSTS480"  "MgSTS474"  "MgSTS113"  "MgSTS106"  "MgSTS69"   "MgSTS56"  
## [277] "MgSTS31"   "MgSTS95"   "MgSTS262"  "MgSTS50"   "MgSTS76"   "MgSTS388" 
## [283] "MgSTS330"  "MgSTS332"  "MgSTS326"  "MgSTS282B" "MgSTS282A" "MgSTS255" 
## [289] "MgSTS350"  "MgSTS362"  "MgSTS344"  "MgSTS37"   "MgSTS34"   "MgSTS426" 
## [295] "MgSTS453"  "MgSTS456"  "MgSTS457"  "MgSTS492"  "MgSTS513"  "MgSTS509" 
## [301] "MgSTS500"  "MgSTS430"  "MgSTS381"  "MgSTS314"  "MgSTS251"  "MgSTS351" 
## [307] "MgSTS347"  "MgSTS320"  "MgSTS293"  "MgSTS578"  "MgSTS571"  "MgSTS574B"
## [313] "MgSTS574a" "MgSTS579"  "MgSTS638"  "MgSTS590"  "MgSTS589"  "MgSTS586" 
## [319] "MgSTS535"  "MgSTS537"  "MgSTS538"  "MgSTS536"  "MgSTS539"  "MgSTS563" 
## [325] "MgSTS558"  "MgSTS419"  "MgSTS611"  "MgSTS632"  "MgSTS609"  "MgSTS600" 
## [331] "MgSTS565"  "MgSTS606"  "MgSTS577"  "MgSTS438"  "MgSTS477"  "MgSTS383" 
## [337] "MgSTS504A" "MgSTS504B" "MgSTS504C" "MgSTS545"  "MgSTS542A" "MgSTS542B"
## [343] "MgSTS598"  "MgSTS441"  "MgSTS104"  "MgSTS511"  "MgSTS621"  "MgSTS622" 
## [349] "MgSTS459"  "MgSTS220"  "MgSTS214"  "MgSTS467"  "MgSTS470"  "MgSTS599" 
## [355] "MgSTS431"  "MgSTS440"
no_dist = select_segreg(data_seg, distorted = FALSE, numbers = TRUE)
no_dist
##   [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  17  18  19
##  [19]  20  21  22  23  24  25  26  27  28  29  30  32  33  34  35  36  37  38
##  [37]  39  40  42  44  45  46  47  48  50  51  52  53  54  56  57  58  59  60
##  [55]  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78
##  [73]  79  80  81  82  83  86  87  88  89  91  92  93  94  95  96  97  98  99
##  [91] 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
## [109] 118 119 120 121 122 123 124 125 126 128 129 130 131 132 133 134 136 137
## [127] 138 139 141 142 143 144 145 147 148 149 150 152 153 154 155 156 157 158
## [145] 159 160 161 163 164 165 167 169 170 171 172 173 174 178 179 180 182 183
## [163] 184 185 186 187 188 189 190 191 192 193 194 196 197 198 199 200 201 202
## [181] 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 219 220 221
## [199] 222 223 224 225 226 227 228 229 230 231 232 234 236 237 238 239 240 241
## [217] 242 243 244 245 246 247 248 249 251 252 253 254 255 256 257 258 259 261
## [235] 263 266 267 268 269 270 271 272 273 277 278 279 280 281 282 283 284 287
## [253] 288 289 290 291 293 294 295 296 297 298 299 300 301 302 304 307 308 309
## [271] 310 311 312 313 314 315 316 317 319 320 322 324 325 327 328 329 330 331
## [289] 332 334 336 338 339 340 341 342 343 345 346 347 348 349 350 352 354 355
## [307] 356 357 358 360 361 362 363 364 365 366 367 369 370 371 372 373 374 376
## [325] 379 381 382 383 384 385 386 387 388 390 393 395 396 397 398 399 400 401
## [343] 402 403 405 406 407 408 409 410 411 412 413 414 415 416
plot(data_seg)

In this step, 60 markers with segregation deviation were removed. Now the dataset has 356 markers that will be used in the next analyses.

3. Construction of the Genetic Linkage Maps

The main steps to construct linkage maps are (i) linkage analysis of markers, (ii) assigning markers to linkage groups, (iii) ordering of the markers within linkage groups, and (iv) estimation of genetic distances.

3.1 Linkage Analysis:

Linkage analysis of molecular markers is based on the recombination fraction and odds ratios expressed in logarithm (logarithm of odds - LOD). The recombination fraction is calculated between all pairs of markers (two-point tests) and usually values smaller than 0.5 are used to declare the linkage. The LOD score is the statistic used to evaluate the significance of the test and its value takes into consideration the number of tests performed, which depends of the number of markers. For example, a LOD score of 3 between two markers, indicates that linkage is 1000 times more likely than no linkage.

The recombination fractions between all pairs of markers (two-point tests) were estimated using rf_2pts function. Here, we consider the maximum recombination fraction equal to 0.5 and the LOD equal to 5.42 as suggested by the suggest_lod function.

LOD_sug = suggest_lod(data_bins)
LOD_sug
## [1] 5.425686
twopts = rf_2pts(input.obj = data_bins, LOD = LOD_sug, max.rf = 0.5)
## Computing 86320 recombination fractions:
## 
##  0%  ..................................................  82%
##  82% .................................   100%

3.2 Assigning Markers to Linkage Groups:

Based on the values of recombination fraction and LOD, the markers were assigned to linkage groups using make_seq and group functions. Linkage groups represent chromosomal segments or entire chromosomes.

In this step, we used the vector of markers without segregation distortion. Note that 14 linkage groups were formed.

mark_no_dist = make_seq(twopts, c(no_dist))
lgs = group(mark_no_dist)
##    Selecting markers: 
##    group    1 
##     ......
##    group    2 
##     .....................
##    group    3 
##     ............................................................
##     ......................
##    group    4 
##     ......................................
##    group    5 
##     ..............
##    group    6 
##     ..................................................
##    group    7 
##     ...............................
##    group    8 
##     .........................
##    group    9 
##     ............
##    group    10 
##     .....
##    group    11 
##     .......................
##    group    12 
##     ....................
##    group    13 
##     .....
##    group    14 
##     ..

3.3 Ordering of Linkage Groups and Estimation of Genetic Distances:

3.3.1 Estimation of Genetic Distances:

The final step of the construction of a genetic linkage map involves the estimation of the markers’ order and distance within linkage groups. As the recombination fraction is not additive, mapping functions are required to estimate the distance of markers. Several functions have been proposed but the most used are the mapping functions of Haldane (Haldane, 1919) and Kosambi (Kosambi, 1944). We choose the Kosambi mapping function because it assumes interference between crossover events.

set_map_fun(type = "kosambi")

3.3.2 Ordering of Markers:

The ordering process of the markers is considered an optimization problem (Traveling Salesman Problem - TSP) which seeks to find the best solution among all possible solutions. For \(m\) markers, there are \(m!/2\) possible orders to be investigated and in TSP it is impossible to obtain an exact solution when the number of markers is large. Thus, several methods for ordering molecular markers have proposed to solve the ordering problem such as Rapid Chain Delineation (RCD) (Doerge, 1996), Recombination Counting and Ordering (RECORD) (Van Os et al., 2005), Unidirectional Growth (UG) (Tan and Fu, 2006), and multidimensional scaling (MDS) (Preedy and Hackett, 2016). Another criterion that can be used is the hidden Markov model (HMM) (Lander and Green, 1987). Through HMM, it is possible to obtain the maximum likelihood estimators (MLE) of the values using information from all the markers simultaneously (multipoint).

The OneMap software has two-point approaches and multipoint approaches for estimating the order of markers. As the multipoint approach allows for the retrieval of information from the entire linkage map, we decided to use this approach. Therefore, the ordering of the markers within the linking groups was done using the order_seq function.

LGs_hmm_safe = LGs_hmm_all = vector("list", length = c(lgs$n.groups))
    
    for (i in 1:lgs$n.groups) {
      
        LGs = make_seq(lgs, i)
        LG_hmm = order_seq(LGs, n.init = 5, subset.search = "twopt", twopt.alg = "rcd", THRES = 3)
        LG_safe = make_seq(LG_hmm, "safe")
        LG_all = make_seq(LG_hmm, "force")
        
        
        LGs_hmm_safe[[i]] = LG_safe
        LGs_hmm_all[[i]] = LG_all
        
    }

3.3.3 Plotting the Recombination Fraction Matrix:

The ordering methods provide approximate solutions and may contain errors. Thus, additional tools can be useful in the final diagnosis of the marker ordering in a linkage group.

In OneMap, the ordering of markers within linkage groups can be diagnosed using heat maps. They are made by plotting the recombination matrix based on a color scale, in which, cool colors (blue areas) represent a weak linkage and hot colors (red areas) represent a strong linkage. Hot colors are expected to be concentrated along the diagonal while the cold colors fall far from it. To get the first diagnosis of ordering, we plot a heat map for each linkage group using the rf_graph_table function.

g1 = rf_graph_table(LGs_hmm_all[[1]], mrk.axis = "none")
g2 = rf_graph_table(LGs_hmm_all[[2]], mrk.axis = "none")
grid.arrange(g1, g2, ncol=2)

g3 = rf_graph_table(LGs_hmm_all[[3]], mrk.axis = "none")
g4 = rf_graph_table(LGs_hmm_all[[4]], mrk.axis = "none")
grid.arrange(g3, g4, ncol=2)

g5 = rf_graph_table(LGs_hmm_all[[5]], mrk.axis = "none")
g6 = rf_graph_table(LGs_hmm_all[[6]], mrk.axis = "none")
grid.arrange(g5, g6, ncol=2)

g7 = rf_graph_table(LGs_hmm_all[[7]], mrk.axis = "none")
g8 = rf_graph_table(LGs_hmm_all[[8]], mrk.axis = "none")
grid.arrange(g7, g8, ncol=2)

g9 = rf_graph_table(LGs_hmm_all[[9]], mrk.axis = "none")
g10 = rf_graph_table(LGs_hmm_all[[10]], mrk.axis = "none")
grid.arrange(g9, g10, ncol=2)

g11 = rf_graph_table(LGs_hmm_all[[11]], mrk.axis = "none")
g12 = rf_graph_table(LGs_hmm_all[[12]], mrk.axis = "none")
grid.arrange(g11, g12, ncol=2)

g13 = rf_graph_table(LGs_hmm_all[[13]], mrk.axis = "none")
g14 = rf_graph_table(LGs_hmm_all[[14]], mrk.axis = "none")
grid.arrange(g13, g14, ncol=2)

Among all the linkage groups, group 3 and group 14 were the groups that most called our attention. Group 3 has an unusual pattern and is likely made up of several other groups. Group 14 has only 3 markers and these markers probably come from other groups.

3.3.4 Comparing the Maps:

To verify these hypotheses, we initially compared all linkage groups with all linkage groups from the published map. When we runned the analysis, we observed the following aspects:

  • nine groups correspond well with the published map (LG2, LG4, LG5, LG6, LG7, LG8, LG10, LG11, and LG12);

  • many markers of group 3 are present in groups 3, 7, and 10 of the published map;

  • some markers from group 1 and 13 are present only in group 1 of the published map and some markers from group 9 and 14 are present only in group 14 of the published map;

  • one marker of group 11 is also present in group 2 of the published map.

map_1 = list () 
    map_1[[1]] = c("CC138","BA153","AA173C","BA214","AAT267","BA129",
                  "CA389C","CA174","BA416","BA374","AAT225","AAT333")
    
    map_1[[2]] = c("CC385C","BA125","AA420","CC130","CA228","BC167",
                     "BA172","CB280","BA175","CC132","BD99","CA279")
    
    map_1[[3]] = c("CC378","BD286","CA220","CA238","CB156","BA75",
                  "BA384","CA131","AA404","BD429","BC586C","BC70")
    
    map_1[[4]] = c("CB329","CA399","CA415","CA233","AA374C","CA497",
                 "CA183C","AA166C","CA384","BD239","BA279C","BA113",
                           "BC321","CC270","CB257","AAT367","AA384")
    
    map_1[[5]] = c( "BB186","CC124","BA69","BB210","BD316C","AA378",
                  "AA268","CC342","AA454C","AA163","BC506","AA118C")
    
    map_1[[6]] = c("AAT230","BD179","AA277","AA158","BD169","CC171C",
                   "AAT300","CC381","CA283","CC126","BC392","AA371C")
    
    map_1[[7]] = c("BD209","CA258C","AA280","CB173","BB103C","AA361",
                                            "BD170","AAT261","BB102")
    
    map_1[[8]] = c("BA372","CA210","CYCB","CA305","CC450","AAT39",
               "AAT211","CB272","BA314","CA122","CC338C","AAT217",
                                          "CC359","BB167","BA158")
    
    map_1[[9]] = c("CA217","CA167","BB218","BC108","BA396C","LFY",
                  "BA311","AA95","CA196","CA261","CB115","AAT222",
                                                           "BC83")
    
    map_1[[10]] = c("CB309","AAT283","BD433","AA153C","AA100","BB259",
                      "BB122","AAT374","CA289","BB281","CA96","BA497",
                                             "CC392","AAT372","BB190")
    
    map_1[[11]] = c("CC61","BC526C","BA387","CC53","BD340","AAT356",
                             "BD100","BA196","BB124","CYCA","BC374")
    
    
    map_1[[12]] = c("BA394","CC114","BD143","BA245C","BA175","AAT308",
                    "AAT364","BC330","AA296C","CA378","CB216","CA140",
                    "BB182")
    
    map_1[[13]] = c( "BB198","BC199","BA145","AAT240","CB126","CB263C",
                                                "CB55","BA334","CB172")
    
    map_1[[14]] = c("BC542","CA267","BB216","BD251","CA75","BD371",
                                     "CC93","AA137","BC80","CC320")
map_2 = list () 
    map_2[[1]] = data_seg$Marker[LGs_hmm_all[[1]]$seq.num]
    map_2[[2]] = data_seg$Marker[LGs_hmm_all[[2]]$seq.num]
    map_2[[3]] = data_seg$Marker[LGs_hmm_all[[3]]$seq.num]
    map_2[[4]] = data_seg$Marker[LGs_hmm_all[[4]]$seq.num]
    map_2[[5]] = data_seg$Marker[LGs_hmm_all[[5]]$seq.num]
    map_2[[6]] = data_seg$Marker[LGs_hmm_all[[6]]$seq.num]
    map_2[[7]] = data_seg$Marker[LGs_hmm_all[[7]]$seq.num]
    map_2[[8]] = data_seg$Marker[LGs_hmm_all[[8]]$seq.num]
    map_2[[9]] = data_seg$Marker[LGs_hmm_all[[9]]$seq.num]
    map_2[[10]] = data_seg$Marker[LGs_hmm_all[[10]]$seq.num]
    map_2[[11]] = data_seg$Marker[LGs_hmm_all[[11]]$seq.num]
    map_2[[12]] = data_seg$Marker[LGs_hmm_all[[12]]$seq.num]
    map_2[[13]] = data_seg$Marker[LGs_hmm_all[[13]]$seq.num]
    map_2[[14]] = data_seg$Marker[LGs_hmm_all[[14]]$seq.num]
compare = matrix(nrow = 14, ncol =14)
    
      for (i in 1:14) {
      
      map_2[[i]] 
      
          for (j  in 1:14)
            
          compare[i,j] = sum(map_2[[i]] %in% map_1[[j]])
      
      }
compare
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
##  [1,]    4    0    0    0    0    0    0    0    0     0     0     0     0
##  [2,]    0   11    0    0    0    0    0    0    0     0     0     0     0
##  [3,]    0    0   12    0    0    0    9    0    0    15     0     0     0
##  [4,]    0    0    0   16    0    0    0    0    0     0     0     0     0
##  [5,]    0    0    0    0   10    0    0    0    0     0     0     0     0
##  [6,]    0    0    0    0    0   12    0    0    0     0     0     0     0
##  [7,]    0    0    0    0    0    0    0   15    0     0     0     0     0
##  [8,]    0    0    0    0    0    0    0    0   13     0     0     0     0
##  [9,]    0    0    0    0    0    0    0    0    0     0     0     0     0
## [10,]    0    0    0    0    0    0    0    0    0     0     1     0     0
## [11,]    0    1    0    0    0    0    0    0    0     0     0    13     0
## [12,]    0    0    0    0    0    0    0    0    0     0     0     0     9
## [13,]    2    0    0    0    0    0    0    0    0     0     0     0     0
## [14,]    0    0    0    0    0    0    0    0    0     0     0     0     0
##       [,14]
##  [1,]     0
##  [2,]     0
##  [3,]     0
##  [4,]     0
##  [5,]     0
##  [6,]     0
##  [7,]     0
##  [8,]     0
##  [9,]     6
## [10,]     0
## [11,]     0
## [12,]     0
## [13,]     0
## [14,]     1

3.3.5 Checking the Linkage Groups:

Linkage Group 3:
These comparisons were very useful because from them we confirm our hypotheses, discover other information and make some decisions. The first decision was taken in relation to group 3. Initially, we removed some badly positioned markers using drop_marker function and we grouped these markers again. As expected, three groups were formed. Later, the markers of each group were ordered again.

rf_graph_table(LGs_hmm_all[[3]], mrk.axis = "numbers")

LG3 = LGs_hmm_all[[3]]
LG3 = drop_marker(LG3, c(234,220,130, 236,403))
LG3 = map(LG3)
LG3 = group(LG3, LOD = LOD_sug)
##    Selecting markers: 
##    group    1 
##     ...................................
##    group    2 
##     ......................
##    group    3 
##     ..................
LG3_hmm_safe = LG3_hmm_all = vector("list", length = c(LG3$n.groups))

for (i in 1:LG3$n.groups) {
      
      LGs = make_seq(LG3, i)
      
      LG3_hmm = order_seq(input.seq = LGs, n.init = 5,
                              subset.search = "twopt",
                         twopt.alg = "rcd", THRES = 3)
      
      LG3_safe = make_seq(LG3_hmm, "safe")
      LG3_all = make_seq(LG3_hmm, "force")
      
      LG3_hmm_safe[[i]] = LG3_safe
      LG3_hmm_all[[i]] = LG3_all
      
    }
g1 = rf_graph_table(LG3_hmm_all[[1]], mrk.axis = "none")
g2 = rf_graph_table(LG3_hmm_all[[2]], mrk.axis = "none")
g3 = rf_graph_table(LG3_hmm_all[[3]], mrk.axis = "none")
grid.arrange(g1, g2, g3, ncol=3)

# Linkage groups of the new map (16 groups)
map_3 = list () 
    map_3[[1]] = data_seg$Marker[LGs_hmm_all[[1]]$seq.num]
    map_3[[2]] = data_seg$Marker[LGs_hmm_all[[2]]$seq.num]
    map_3[[3]] = data_seg$Marker[LG3_hmm_all[[1]]$seq.num]
    map_3[[4]] = data_seg$Marker[LG3_hmm_all[[2]]$seq.num]
    map_3[[5]] = data_seg$Marker[LG3_hmm_all[[3]]$seq.num]
    map_3[[6]] = data_seg$Marker[LGs_hmm_all[[4]]$seq.num]
    map_3[[7]] = data_seg$Marker[LGs_hmm_all[[5]]$seq.num]
    map_3[[8]] = data_seg$Marker[LGs_hmm_all[[6]]$seq.num]
    map_3[[9]] = data_seg$Marker[LGs_hmm_all[[7]]$seq.num]
    map_3[[10]] = data_seg$Marker[LGs_hmm_all[[8]]$seq.num]
    map_3[[11]] = data_seg$Marker[LGs_hmm_all[[9]]$seq.num]
    map_3[[12]] = data_seg$Marker[LGs_hmm_all[[10]]$seq.num]
    map_3[[13]] = data_seg$Marker[LGs_hmm_all[[11]]$seq.num]
    map_3[[14]] = data_seg$Marker[LGs_hmm_all[[12]]$seq.num]
    map_3[[15]] = data_seg$Marker[LGs_hmm_all[[13]]$seq.num]
    map_3[[16]] = data_seg$Marker[LGs_hmm_all[[14]]$seq.num]
compare = matrix(nrow = 16, ncol =14)
    
    for (i in 1:16) {
      
      map_3[[i]] 
      
      for (j  in 1:14)
        
        compare[i,j] = sum(map_3[[i]] %in% map_1[[j]])
      
    }
compare
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
##  [1,]    4    0    0    0    0    0    0    0    0     0     0     0     0
##  [2,]    0   11    0    0    0    0    0    0    0     0     0     0     0
##  [3,]    0    0    0    0    0    0    0    0    0    15     0     0     0
##  [4,]    0    0   11    0    0    0    0    0    0     0     0     0     0
##  [5,]    0    0    0    0    0    0    9    0    0     0     0     0     0
##  [6,]    0    0    0   16    0    0    0    0    0     0     0     0     0
##  [7,]    0    0    0    0   10    0    0    0    0     0     0     0     0
##  [8,]    0    0    0    0    0   12    0    0    0     0     0     0     0
##  [9,]    0    0    0    0    0    0    0   15    0     0     0     0     0
## [10,]    0    0    0    0    0    0    0    0   13     0     0     0     0
## [11,]    0    0    0    0    0    0    0    0    0     0     0     0     0
## [12,]    0    0    0    0    0    0    0    0    0     0     1     0     0
## [13,]    0    1    0    0    0    0    0    0    0     0     0    13     0
## [14,]    0    0    0    0    0    0    0    0    0     0     0     0     9
## [15,]    2    0    0    0    0    0    0    0    0     0     0     0     0
## [16,]    0    0    0    0    0    0    0    0    0     0     0     0     0
##       [,14]
##  [1,]     0
##  [2,]     0
##  [3,]     0
##  [4,]     0
##  [5,]     0
##  [6,]     0
##  [7,]     0
##  [8,]     0
##  [9,]     0
## [10,]     0
## [11,]     6
## [12,]     0
## [13,]     0
## [14,]     0
## [15,]     0
## [16,]     1

Joining Linkage Group (1 and 13; 9 and 14):
The second decision was made in relation to groups 1 and 13 and groups 9 and 14. The junctions of groups 1 and 13 and 9 and 14 were made and the markers were ordered again in their respective groups.
LG1 = LGs_hmm_all[[1]]$seq.num
LG13 = LGs_hmm_all[[13]]$seq.num

seq1.13 = c(LG1, LG13)
seq1.13 = make_seq(twopts, seq1.13)
group_LG1.13 = group(seq1.13, LOD = 4)
##    Selecting markers: 
##    group    1 
##     ............
LG1.13_order = order_seq(seq1.13)
LG1.13_order = make_seq(LG1.13_order, "force")
rf_graph_table(LG1.13_order, mrk.axis = "numbers")

LG9 = LGs_hmm_all[[9]]$seq.num
LG14 = LGs_hmm_all[[14]]$seq.num
    
seq9.14 = c(LG9, LG14)
seq9.14 = make_seq(twopts, seq9.14)
group_LG9.14 = group(seq9.14, LOD = 4)
##    Selecting markers: 
##    group    1 
##     ...............
LG9.14_order = order_seq(seq9.14)
LG9.14_order = make_seq(LG9.14_order, "force")
rf_graph_table(LG9.14_order, mrk.axis = "numbers")

Linkage Group 11:
Finally, when analyzing the heatmap of group 11, we saw that marker 44 was misplaced and this is exactly the marker that corresponds to group 2 of the published map.
rf_graph_table(LGs_hmm_all[[11]], mrk.axis = "numbers")

compare = map_2[[11]] %in% map_1[[2]]
position = which(compare == TRUE)
position
## [1] 14

3.3.6 Update of Linkage Groups:

Once the 14 groups were established, each group was carefully analyzed. The unreliable markers, along with any linked but unplaced markers, were then individually evaluated using the drop_marker, map, try_seq, make_seq, and ripple_seq functions. The purpose of the ripple_seq function is to evaluate alternative orders.

LG1 = LG1.13_order
LG2 = LGs_hmm_all[[2]] 
LG3 = LG3_hmm_all[[2]]
LG4 = LGs_hmm_all[[4]]
LG5 = LGs_hmm_all[[5]]
LG6 = LGs_hmm_all[[6]]
LG7 = LG3_hmm_all[[3]]
LG8 = LGs_hmm_all[[7]]
LG9 = LGs_hmm_all[[8]]
LG10 = LG3_hmm_all[[1]]
LG11 = LGs_hmm_all[[10]]
LG12 = LGs_hmm_all[[11]]
LG13 = LGs_hmm_all[[12]]
LG14 = LG9.14_order

Linkage Group 1:

rf_graph_table(LG1, mrk.axis = "numbers")

LG1_drop1 = drop_marker(LG1, c(257, 1))
LG1_map1 = map(LG1_drop1)
ripple_seq(LG1_map1, ws = 5)
LG1_drop2 = drop_marker(LG1_map1, c(225,28,96))
LG1_map2 = map(LG1_drop2)
LG1_extend_225 = try_seq(LG1_map2, 225)
LG1_extend_225 = make_seq(LG1_extend_225, 3, 1)
rf_graph_table(LG1_extend_225, mrk.axis = "numbers")

LG1_extend_28 = try_seq(LG1_extend_225, 28)
LG1_extend_28 = make_seq(LG1_extend_28, 4, 1)
rf_graph_table(LG1_extend_28, mrk.axis = "numbers")

LG1_extend_96 = try_seq(LG1_extend_28, 96)
LG1_extend_96 = make_seq(LG1_extend_96, 5, 1)
LG1_final = LG1_extend_96
rf_graph_table(LG1_final, mrk.axis = "numbers")

Linkage Group 2:

rf_graph_table(LG2, mrk.axis = "numbers")

LG2_drop1 = drop_marker(LG2, c(251,83))
LG2_map1 = map(LG2_drop1)
ripple_seq(LG2_map1, ws = 5)
LG2_final = LG2_map1
rf_graph_table(LG2_final, mrk.axis = "numbers")

Linkage Group 3:

rf_graph_table(LG3, mrk.axis = "numbers")

LG3_drop1 = drop_marker(LG3, c(114,228,117,32,183))
LG3_map1 = map(LG3_drop1)
ripple_seq(LG3_map1, ws = 5)
LG3_final = LG3_map1
rf_graph_table(LG3_final, mrk.axis = "numbers")

Linkage Group 4:

rf_graph_table(LG4, mrk.axis = "numbers")

LG4_drop1 = drop_marker(LG4, c(4))
LG4_map1 = map(LG4_drop1)
ripple_seq(LG4_map1, ws = 5)
LG4_drop2 = drop_marker(LG4_map1, c(238,110,291,125,76))
LG4_map2 = map(LG4_drop2)
LG4_extend_238 = try_seq(LG4_map2, 238)
LG4_extend_238 = make_seq(LG4_extend_238, 1, 1)
rf_graph_table(LG4_extend_238, mrk.axis = "numbers")

LG4_extend_110 = try_seq(LG4_extend_238, 110)
LG4_extend_110 = make_seq(LG4_extend_110, 2, 1)
rf_graph_table(LG4_extend_110, mrk.axis = "numbers")

LG4_extend_291 = try_seq(LG4_extend_110, 291)
LG4_extend_291 = make_seq(LG4_extend_291, 3, 1)
rf_graph_table(LG4_extend_291, mrk.axis = "numbers")

LG4_final = drop_marker(LG4_extend_291, c(145,158))
LG4_final = map(LG4_final)
rf_graph_table(LG4_final, mrk.axis = "numbers")

Linkage Group 5:

rf_graph_table(LG5, mrk.axis = "numbers")

LG5_drop1 = drop_marker(LG5, c(191))
LG5_map1 = map(LG5_drop1)
ripple_seq(LG5_map1, ws = 5)
LG5_final = LG5_map1
rf_graph_table(LG5_final, mrk.axis = "numbers")

Linkage Group 6:

rf_graph_table(LG6, mrk.axis = "numbers")

LG6_drop1 = drop_marker(LG6, c(6,203,310,212,149))
LG6_map1 = map(LG6_drop1)
ripple_seq(LG6_map1, ws = 5)
LG6_final = LG6_map1
rf_graph_table(LG6_final, mrk.axis = "numbers")

Linkage Group 7:

rf_graph_table(LG7, mrk.axis = "numbers")

LG7_drop1 = drop_marker(LG7, c(148,118,71,115))
LG7_map1 = map(LG7_drop1)
rf_graph_table(LG7_map1, mrk.axis = "numbers")

ripple_seq(LG7_map1, ws = 5)
LG7_final = LG7_map1
rf_graph_table(LG7_final, mrk.axis = "numbers")

Linkage Group 8:

rf_graph_table(LG8, mrk.axis = "numbers")

LG8_drop1 = drop_marker(LG8, c(46))
LG8_map1 = map(LG8_drop1)
ripple_seq(LG8_map1, ws = 5)
LG8_final = LG8_map1
rf_graph_table(LG8_final, mrk.axis = "numbers")

Linkage Group 9:

rf_graph_table(LG9, mrk.axis = "numbers")

LG9_drop1 = drop_marker(LG9, c(27,226,17))
LG9_map1 = map(LG9_drop1)
ripple_seq(LG9_drop1, ws = 5)
LG9_extend_117 = try_seq(LG9_map1, 17)
LG9_extend_117 = make_seq(LG9_extend_117, 12, 1)
LG9_final = LG9_extend_117
rf_graph_table(LG9_final, mrk.axis = "numbers")

Linkage Group 10:

rf_graph_table(LG10, mrk.axis = "numbers")

LG10_drop1 = drop_marker(LG10, c(255,107,406,327,123))
LG10_map1 = map(LG10_drop1)
ripple_seq(LG10_map1, ws = 5)
LG10_final = LG10_map1 
rf_graph_table(LG10_map1, mrk.axis = "numbers")

Linkage Group 11:

rf_graph_table(LG11, mrk.axis = "numbers")

ripple_seq(LG11, ws = 5)

Linkage Group 12:

rf_graph_table(LG12, mrk.axis = "numbers")

LG12_drop1 = drop_marker(LG12, c(30,44, 193,204,241))
LG12_map1 = map(LG12_drop1)
ripple_seq(LG12_map1, ws = 5)
LG12_final = LG12_map1
rf_graph_table(LG12_final, mrk.axis = "numbers")

Linkage Group 13:

rf_graph_table(LG13, mrk.axis = "numbers")

LG13_drop1 = drop_marker(LG13, c(116))
LG13_map1 = map(LG13_drop1)
ripple_seq(LG13_map1, ws = 5)
LG13_final = LG13_map1
rf_graph_table(LG13_final, mrk.axis = "numbers")

Linkage Group 14:

rf_graph_table(LG14, mrk.axis = "numbers")

ripple_seq(LG14, ws = 5)
LG14_drop1 = drop_marker(LG14, c(215,99,258,21))
LG14_map1 = map(LG14_drop1)
LG14_extend_21 = try_seq(LG14_map1, 21)
LG14_extend_21 = make_seq(LG14_extend_21, 2, 1)
rf_graph_table(LG14_extend_21, mrk.axis = "numbers")

LG14_extend_215 = try_seq(LG14_extend_21, 215)
LG14_extend_215 = make_seq(LG14_extend_215, 1, 1)
rf_graph_table(LG14_extend_215, mrk.axis = "numbers")

LG14_extend_99 = try_seq(LG14_extend_215, 99)
LG14_extend_99 = make_seq(LG14_extend_99, 1, 1)
rf_graph_table(LG14_extend_99, mrk.axis = "numbers")

LG14_extend_258 = try_seq(LG14_extend_99, 258)
LG14_extend_258 = make_seq(LG14_extend_258, 1, 1)
LG14_final = LG14_extend_258
rf_graph_table(LG14_final, mrk.axis = "numbers")

7. Comparing the Final Map

map_4 = list () 
map_4[[1]] = data_seg$Marker[LG1_final$seq.num]
map_4[[2]] = data_seg$Marker[LG2_final$seq.num]
map_4[[3]] = data_seg$Marker[LG3_final$seq.num]
map_4[[4]] = data_seg$Marker[LG4_final$seq.num]
map_4[[5]] = data_seg$Marker[LG5_final$seq.num]
map_4[[6]] = data_seg$Marker[LG6_final$seq.num]
map_4[[7]] = data_seg$Marker[LG7_final$seq.num]
map_4[[8]] = data_seg$Marker[LG8_final$seq.num]
map_4[[9]] = data_seg$Marker[LG9_final$seq.num]
map_4[[10]] = data_seg$Marker[LG10_final$seq.num]
map_4[[11]] = data_seg$Marker[LG11$seq.num]
map_4[[12]] = data_seg$Marker[LG12_final$seq.num]
map_4[[13]] = data_seg$Marker[LG13_final$seq.num]
map_4[[14]] = data_seg$Marker[LG14_final$seq.num]
compare = matrix(nrow = 14, ncol =14)

for (i in 1:14) {
  
  map_4[[i]] 
  
  for (j  in 1:14)
    
    compare[i,j] = sum(map_4[[i]] %in% map_1[[j]])
  
}

compare
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
##  [1,]    5    0    0    0    0    0    0    0    0     0     0     0     0
##  [2,]    0    9    0    0    0    0    0    0    0     0     0     0     0
##  [3,]    0    0   10    0    0    0    0    0    0     0     0     0     0
##  [4,]    0    0    0   13    0    0    0    0    0     0     0     0     0
##  [5,]    0    0    0    0    9    0    0    0    0     0     0     0     0
##  [6,]    0    0    0    0    0   11    0    0    0     0     0     0     0
##  [7,]    0    0    0    0    0    0    7    0    0     0     0     0     0
##  [8,]    0    0    0    0    0    0    0   14    0     0     0     0     0
##  [9,]    0    0    0    0    0    0    0    0   13     0     0     0     0
## [10,]    0    0    0    0    0    0    0    0    0    12     0     0     0
## [11,]    0    0    0    0    0    0    0    0    0     0     1     0     0
## [12,]    0    0    0    0    0    0    0    0    0     0     0    11     0
## [13,]    0    0    0    0    0    0    0    0    0     0     0     0     8
## [14,]    0    0    0    0    0    0    0    0    0     0     0     0     0
##       [,14]
##  [1,]     0
##  [2,]     0
##  [3,]     0
##  [4,]     0
##  [5,]     0
##  [6,]     0
##  [7,]     0
##  [8,]     0
##  [9,]     0
## [10,]     0
## [11,]     0
## [12,]     0
## [13,]     0
## [14,]     7
After all manipulations were done, we compared the final map with the published map and observed that the two maps matched well.

8. Drawing the Genetic Linkage Map

Once all linkage groups were obtained, the final map was drawn using the draw_map2 function. The final map has 305 markers distributed across 14 linkage groups. Remembering that after the two filterings we were left with 356 markers, so 51 doubtful markers were removed from this analysis.

draw_map2(LG1_final, LG2_final, LG3_final, LG4_final, LG5_final, 
   LG6_final, LG7_final, LG8_final, LG9_final, LG10_final, LG11, 
                LG12_final, LG13_final, LG14_final, tag = "all", 
  group.names = c("LG1","LG2","LG3", "LG4", "LG5", "LG6", "LG7", 
              "LG8","LG9","LG10","LG11", "LG12","LG13", "LG14"),
                                      output = "map_final.pdf")

References:

Doerge, R. and B. Weir. Constructing genetic maps by rapid chain delineation. 1994.

Fishman, L.A., Kelly J., Morgan, E., Willis J.H. A genetic map in the Mimulus guttatus species complex reveals transmission ratio distortion due to heterospecific interactions. Genetics 159:1701-1716, 2001.

Haldane, J. B. S. The combination of linkage values, and the calculation of distances between the loci of linked factors. Hournal of Gnetics 8: 299–309, 1919.

Kosambi, D. D. The estimation of map distances from recombination values. volume 12, pp. 172–175, Annals of Eugenics, 1944.

Lander, E. S. and Green, P. Construction of multilocus genetic linkage maps in humans. Proc. Natl. Acad. Sci. USA 84, 2363-2367, 1987.

Margarido G. R. A., Souza A. P., Garcia A. A. F., 2007. OneMap: software for genetic mapping in outcrossing species. Hereditas 144: 78–79.

Preedy, K. F. and C. A. Hackett. A rapid marker ordering approach for high-density genetic linkage maps in experimental autotetraploid populations using multidimensional scaling. Theoretical and Applied Genetics 129: 2117–2132, 2016.

Tan, Y.-D. and Y.-X. Fu. A novel method for estimating linkage maps. Genetics 173: 2383–2390, 2006.

Van Os, H., P. Stam, R. G. Visser, and H. J. Van Eck. Record: a novel method for ordering loci on a genetic linkage map. Theoretical and Applied Genetics 112: 30–40, 2005.

Wu, R., 2002 Simultaneous Maximum Likelihood Estimation of Linkage and Linkage Phases in Outcrossing Species. Theoretical population biology 363: 349–363.